package decoration;

import java.io.*;

/**
 * @Author: linKe
 * @Date: 2022/1/15 9:56
 * @FileName: LowerCaseInputStream
 * @version: 1.0
 * @Description: 自己实现过滤流
 * FilterInputStream包含一些其他输入流，它用作其基本数据源，可能沿途转换数据或提供附加功能。
 * FilterInputStream类本身只是简单地覆盖InputStream的所有方法，其版本将所有请求传递给包含的输入流。
 * FilterInputStream的子类可能会进一步覆盖其中一些方法，并且还可能提供额外的方法和字段。
 */
public class LowerCaseInputStream extends FilterInputStream {
    protected LowerCaseInputStream(InputStream in) {
        // 通过将参数in分配给字段this.in来创建一个FilterInputStream ，以便记住它以供以后使用。
        super(in);
    }

    @Override
    public int read() throws IOException {
        // 调用父类的写入流
        // 从此输入流中读取数据的下一个字节。 值字节以int形式返回，范围0到255 。
        // 如果由于到达流的末尾而没有可用的字节，则返回值-1 。 此方法会一直阻塞，直到输入数据可用、检测到流结束或引发异常。
        int i = super.read();
        if(i != -1) {
            char c = (char) i;
            c = Character.toLowerCase(c);
            return c;
        }
        return i;
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        // 数组转换读取
        // 从此输入流中读取最多len个字节的数据到一个字节数组中。
        // 如果len不为零，则该方法会阻塞，直到某些输入可用； 否则，不读取任何字节并返回0 。
        int result = super.read(b, off, len);
        for(int i = 0;i < off + result;i ++) {
            b[i] = (byte) Character.toLowerCase((char) b[i]);
        }
        return result;
    }
}
